home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / aplictns / mandel10 / part02 < prev    next >
Internet Message Format  |  1991-02-18  |  56KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i018: Mandel 1.0 - yet another mandelbrot, Part02/04
  4. Reply-To: dm@stekt.oulu.fi (Hannu Helminen ti)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i018@ab20.larc.nasa.gov>
  7. References: <comp.sources.amiga:v91i017@ab20.larc.nasa.gov>
  8. Date: 18 Feb 91 22:25:43 GMT
  9. Approved: tadguy@uunet.UU.NET (Tad Guy)
  10. X-Mail-Submissions-To: amiga@uunet.uu.net
  11. X-Post-Discussions-To: comp.sys.amiga.misc
  12.  
  13. Submitted-by: dm@stekt.oulu.fi (Hannu Helminen ti)
  14. Posting-number: Volume 91, Issue 018
  15. Archive-name: applications/mandel-1.0/part02
  16.  
  17. #!/bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 2 (of 4)."
  24. # Contents:  source/gui.asm.ab source/gui.asm.ac
  25. # Wrapped by tadguy@ab20 on Mon Feb 18 17:25:39 1991
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'source/gui.asm.ab' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'source/gui.asm.ab'\"
  29. else
  30. echo shar: Extracting \"'source/gui.asm.ab'\" \(25782 characters\)
  31. sed "s/^X//" >'source/gui.asm.ab' <<'END_OF_FILE'
  32. X         beq.s    no_bl
  33. X         move.w   d2,d0
  34. X         move.w   d5,d1
  35. X         Call     DrawBorder
  36. Xno_bl:
  37. X         move.l   a4,a1
  38. X         move.l   a2,a0
  39. X         move.l   a1,pic_tr
  40. X         beq.s    no_tr
  41. X         move.w   d4,d0
  42. X         move.w   d3,d1
  43. X         Call     DrawBorder
  44. Xno_tr:
  45. X         move.l   a5,a1
  46. X         move.l   a2,a0
  47. X         move.l   a1,pic_br
  48. X         beq.s    no_br
  49. X         move.w   d4,d0
  50. X         move.w   d5,d1
  51. X         Call     DrawBorder
  52. Xno_br:
  53. X         pull     a3-a5
  54. X         bra.s    draw_pulling
  55. Xpig_big:
  56. X         clr.l    pic_tl
  57. X         clr.l    pic_bl
  58. X         clr.l    pic_tr
  59. X         clr.l    pic_br
  60. Xdraw_pulling:
  61. X         pull     a0-a2/a6/d0-d7
  62. Xdraw_over:
  63. X         rts
  64. X
  65. Xcalculate:
  66. X* Calculate centerpoint coordinates.
  67. X* Only needed when string gadget updated.
  68. X* The formula we use is (CurrentX - mb_x(a4)) / mb_dx(a4) (for x)
  69. X* and because I would have to use 32-bit division which my processor
  70. X* does unfortunately not have any instructions for, we use 16-bit
  71. X* division, which is much more tricky!
  72. X
  73. X* Another problem occurs when user enters a number that is NOT
  74. X* in the visible area. Because our number system can only represent
  75. X* numbers from -4 to 4, we have no reliable way of telling whether
  76. X* user wants to see grid to be (arrows!) to the LEFT, for instance,
  77. X* or to the RIGHT.
  78. X
  79. X* Currently any such numbers map to RIGHT and DOWN. One could try
  80. X* to fix it by choosing numbers that are as close to previous prex
  81. X* and prey as possible.
  82. X* I wont try to code that, however, my hair is grey enough now.
  83. X
  84. X         push     d0-d4
  85. X         move.l   mb_dx(a4),d2
  86. X         move.l   CurrentX,d4
  87. X         sub.l    mb_x0(a4),d4
  88. Xfix_div_x:
  89. X         cmp.l    #$10000,d2
  90. X         blo.s    fixed_x
  91. X         lsr.l    #1,d2
  92. X         lsr.l    #1,d4
  93. X         bra.s    fix_div_x
  94. Xfixed_x:
  95. X         divu     d2,d4
  96. X         move.l   d4,d0    ; renormalize remainder
  97. X         clr.w    d0
  98. X         divu     d2,d0
  99. X         swap     d0
  100. X         move.w   d4,d0
  101. X
  102. X         move.l   mb_dy(a4),d2
  103. X         move.l   mb_y0(a4),d4
  104. X         sub.l    CurrentY,d4
  105. Xfix_div_y:
  106. X         cmp.l    #$10000,d2
  107. X         blo.s    fixed_y
  108. X         lsr.l    #1,d2
  109. X         lsr.l    #1,d4
  110. X         bra.s    fix_div_y
  111. Xfixed_y:
  112. X         divu     d2,d4
  113. X         move.l   d4,d1
  114. X         clr.w    d1
  115. X         divu     d2,d1
  116. X         swap     d1
  117. X         move.w   d4,d1
  118. X
  119. X         swap     d0
  120. X         swap     d1
  121. X
  122. X         move.l   d0,prex
  123. X         move.l   d1,prey
  124. X         pull     d0-d4
  125. X         rts
  126. X
  127. XStringGadgetDown:
  128. X* GadgetID in d1
  129. X         and.w    #IDMASK,d1
  130. X
  131. X* We will wait for another message, thenafter we know the user has
  132. X* finished playing with the string gadget. This message could be the
  133. X* GADGETUP of same gadget, but then again, it could be something
  134. X* else.
  135. X* We must preserve the message (so that main loop may handle it).
  136. X         move.l   a5,a1       ; save gadget
  137. X         bsr      GetMessage
  138. X
  139. X         move.l   gg_SpecialInfo(a1),a0
  140. X         move.l   si_Buffer(a0),a0        ; addr of the actual string
  141. X
  142. X         cmp.w    #GAD_X,d1
  143. X         beq.s    gadget_x
  144. X         cmp.w    #GAD_Y,d1
  145. X         beq.s    gadget_y
  146. X         cmp.w    #GAD_M,d1
  147. X         beq      gadget_m
  148. X         cmp.w    #GAD_Z,d1
  149. X         beq.s    gadget_z
  150. X* now it must be IGadget
  151. X         bsr      GetNum
  152. X         beq.s    2$
  153. X         tst.b    (a0)
  154. X         beq.s    1$
  155. X2$:
  156. X         move.w   mb_i(a4),d0
  157. X1$:      move.w   d0,mb_i(a4)
  158. X         bsr      refresh_i
  159. X         bra.s    gadget_done
  160. X
  161. Xgadget_x:
  162. X         bsr      GetFixed
  163. X         beq.s    2$
  164. X         tst.b    (a0)     ; if user entered some ugly stuff after numbers
  165. X         beq.s    1$
  166. X2$:
  167. X         move.l   CurrentX,d0 ; invalid -> get previous
  168. X1$:      move.l   d0,CurrentX
  169. X         bsr      calculate
  170. X         bsr      refresh_x
  171. X         bsr      DrawGrid
  172. X         bra.s    gadget_done
  173. X
  174. Xgadget_y:
  175. X         bsr      GetFixed
  176. X         beq.s    2$
  177. X         tst.b    (a0)
  178. X         beq.s    1$
  179. X2$:
  180. X         move.l   CurrentY,d0
  181. X1$:      move.l   d0,CurrentY
  182. X         bsr      calculate
  183. X         bsr      refresh_y
  184. X         bsr      DrawGrid
  185. X         bra.s    gadget_done
  186. X
  187. Xgadget_z:
  188. X         bsr      GetSMagnify
  189. X         beq.s    2$
  190. X         tst.b    (a0)
  191. X         beq.s    1$
  192. X2$:
  193. X         move.l   Zoom,d0
  194. X1$:      move.l   d0,Zoom
  195. X         bsr      refresh_z
  196. X         bra.s    gadget_done
  197. Xgadget_m:
  198. X         bsr      GetMagnify
  199. X         beq.s    2$
  200. X         tst.b    (a0)
  201. X         beq.s    1$
  202. X2$:
  203. X         move.l   Magnify,d0
  204. X1$:      move.l   d0,Magnify
  205. X         bsr      refresh_m
  206. X
  207. Xgadget_done:
  208. X         moveq    #0,d0
  209. X
  210. Xget_rid_of_us:
  211. X         rts
  212. X
  213. X
  214. XOtherGadgetDown:
  215. X* GadgetID in d1
  216. X         move.w   d1,d0
  217. X         and.w    #ZOOMTYPE,d0
  218. X         beq      not_zoom_gadget
  219. X         and.w    #IDMASK,d1
  220. X
  221. X         move.b   #ZOOM,d0
  222. X         cmp.w    #GAD_ZOOM,d1
  223. X         beq.s    1$
  224. X
  225. X         move.b   #REDRAW,d0
  226. X         cmp.w    #GAD_DRAW,d1
  227. X         beq.s    1$
  228. X
  229. X         move.b   #RESET,d0
  230. X1$:
  231. X         move.b   d0,method
  232. X         bsr      refresh_zoom
  233. X* Double-click to start drawing
  234. X         move.l   OldSecs,d0
  235. X         move.l   OldMicros,d1
  236. X         move.l   a2,d2
  237. X         move.l   a3,d3
  238. X         move.l   a2,OldSecs
  239. X         move.l   a3,OldMicros
  240. X         Call     DoubleClick
  241. X         tst.w    d0
  242. X         beq.s    not_yet
  243. X         moveq    #-1,d0         ; result is negative
  244. Xnot_yet:
  245. X         rts
  246. X
  247. Xnot_zoom_gadget:
  248. X         move.w   d1,d0
  249. X         and.w    #SETTYPE,d0
  250. X         beq.s    not_set_gadget
  251. X         and.w    #IDMASK,d1
  252. X
  253. X         bclr.b   #MBB_JULIA,mb_flags(a4)
  254. X         cmp.w    #GAD_MANDEL,d1
  255. X         beq.s    1$
  256. X         bset.b   #MBB_JULIA,mb_flags(a4)
  257. X1$:
  258. X         bsr      refresh_set
  259. X
  260. X         moveq    #FALSE,d0
  261. X         rts
  262. X
  263. Xnot_set_gadget:
  264. X         cmp.w    #GAD_QUIT,d1
  265. X         bne.s    not_quit_gadget
  266. X* Double-click to exit
  267. X         move.l   OldSecs,d0
  268. X         move.l   OldMicros,d1
  269. X         move.l   a2,d2
  270. X         move.l   a3,d3
  271. X         move.l   a2,OldSecs
  272. X         move.l   a3,OldMicros
  273. X         Call     DoubleClick
  274. X         tst.w    d0
  275. X         beq.s    first_click
  276. X         moveq    #TRUE,d0          ; +1 -> quitting
  277. Xfirst_click:
  278. X         rts
  279. X
  280. Xnot_quit_gadget:
  281. X         and.w    #IDMASK,d1
  282. X         moveq    #0,d7
  283. X         move.w   d1,d7
  284. Xit_was_timer:
  285. X         bsr      plus_minus
  286. X         lea      IOreq,a1
  287. X
  288. X* Shortage of registers -- we must use upper half of d7
  289. X         swap     d7
  290. X         move.l   #400000,d0  ; .4 seconds initial delay
  291. X         tst.w    d7
  292. X         beq.s    huu_haa_joo_jaa
  293. X         move.l   #100000,d0  ; .1 seconds next 9
  294. X         cmp.w    #9,d7
  295. X         blo.s    huu_haa_joo_jaa
  296. X         move.l   #020000,d0  ; 1/25 seconds
  297. X         move.w   #-2,d7      ; neverending!
  298. Xhuu_haa_joo_jaa:
  299. X         addq.w   #1,d7
  300. X         swap     d7
  301. X
  302. X         move.w   #TR_ADDREQUEST,IO_COMMAND(a1)
  303. X         move.l   #0,IOTV_TIME+TV_SECS(a1)
  304. X         move.l   d0,IOTV_TIME+TV_MICRO(a1)
  305. X         move.l   a1,UseReq
  306. X         Base     Exec
  307. X         Call     SendIO
  308. X         bsr      GetMessage
  309. X         bne.s    1$             ; that old ^C
  310. X         cmp.w    #FAKECLASS,d2
  311. X         beq.s    it_was_timer
  312. X         moveq    #FALSE,d7
  313. X         bra.s    2$
  314. X1$:
  315. X         moveq    #TRUE,d7
  316. X2$:
  317. X         move.l   UseReq,a1
  318. X         Call     AbortIO
  319. X         move.l   UseReq,a1
  320. X         Call     WaitIO
  321. X         clr.l    UseReq
  322. X         tst.w    d7
  323. X         rts
  324. X
  325. X         moveq    #0,d0
  326. X         rts
  327. X
  328. Xplus_minus:
  329. X* GadgetID in d2
  330. X         push     d0-d1
  331. X         move.w   d7,d0
  332. X         moveq    #1,d1
  333. X         and.w    #$7fff,d0
  334. X         cmp.w    #GAD_X,d0
  335. X         bne.s    skip_x
  336. X
  337. X         move.l   mb_dx(a4),d0
  338. X         swap     d1
  339. X         tst.w    d7
  340. X         bpl.s    1$
  341. X         neg.l    d0
  342. X         neg.l    d1
  343. X1$:
  344. X         add.l    d0,CurrentX
  345. X         add.l    d1,prex
  346. X         move.l   CurrentX,d0
  347. X         bsr      refresh_x
  348. X         bsr      DrawGrid
  349. X         bra      plus_minus_done
  350. Xskip_x:
  351. X         cmp.w    #GAD_Y,d0
  352. X         bne.s    skip_y
  353. X
  354. X         move.l   mb_dy(a4),d0
  355. X         swap     d1
  356. X         tst.w    d7
  357. X         bpl.s    1$
  358. X         neg.l    d0
  359. X         neg.l    d1
  360. X1$:
  361. X         add.l    d0,CurrentY
  362. X         sub.l    d1,prey
  363. X         move.l   CurrentY,d0
  364. X         bsr      refresh_y
  365. X         bsr      DrawGrid
  366. X         bra.s    plus_minus_done
  367. Xskip_y:
  368. X         cmp.w    #GAD_M,d0
  369. X         bne.s    skip_m
  370. X
  371. X         move.l   #$1999,d0
  372. X         tst.w    d7
  373. X         bpl.s    1$
  374. X         neg.l    d0
  375. X1$:
  376. X         add.l    d0,Magnify
  377. X         move.l   Magnify,d0
  378. X         bsr      refresh_m
  379. X         bra.s    plus_minus_done
  380. Xskip_m:
  381. X         cmp.w    #GAD_Z,d0
  382. X         bne.s    skip_z
  383. X
  384. X         move.l   #$1999,d0
  385. X         tst.w    d7
  386. X         bpl.s    1$
  387. X         neg.l    d0
  388. X1$:
  389. X         add.l    d0,Zoom
  390. X         move.l   Zoom,d0
  391. X         bsr      refresh_z
  392. X         bra.s    plus_minus_done
  393. Xskip_z:
  394. X         cmp.w    #GAD_I,d0
  395. X         bne.s    plus_minus_done
  396. X
  397. X         tst.w    d7
  398. X         bpl.s    1$
  399. X         neg.l    d1
  400. X1$:
  401. X         add.w    d1,mb_i(a4)
  402. X         move.w   mb_i(a4),d0
  403. X         bsr      refresh_i
  404. Xplus_minus_done:
  405. X         pull     d0-d1
  406. X         rts
  407. X
  408. X
  409. X
  410. X* This group of routines updates whatever visual clues the user might
  411. X* have about the current situation.
  412. X
  413. X* NOTE: a DrawGrid is needed after every refresh_x or refresh_y.
  414. X* (To avoid drawing it twice if both coords updated)
  415. X
  416. X* d0 is the fresh number.
  417. X* Preserves all registers.
  418. Xrefresh_x:
  419. X         push     d0-d2/d7/a0-a3/a6
  420. X         move.l   MyWindow2,a2   ; save thing from being overwritten
  421. X         lea      XGadget,a3
  422. X* If in MANDEL mode, alter c = jx + jy settings.
  423. X* So user may set jx,jy, enter JULIA mode and still
  424. X* select another point.
  425. X         btst.b   #MBB_JULIA,mb_flags(a4)
  426. X         bne.s    1$
  427. X         move.l   d0,mb_jx(a4)
  428. X1$:
  429. X         move.l   d0,d2
  430. X
  431. X         move.l   a2,a0          ; window
  432. X         move.l   a3,a1          ; gadget
  433. X         Base     Intuition
  434. X         Call     RemoveGadget   ; remove, modify, add back.
  435. X* Later we will insert this gadget back to its original place.
  436. X* That is why d2 gets position. toDec needs number in d0.
  437. X         exg.l    d0,d2
  438. X
  439. X         move.l   gg_SpecialInfo(a3),a0
  440. X         move.l   si_Buffer(a0),a0
  441. X
  442. X         move.l   mb_dx(a4),d7   ; delta (see toDec why)
  443. X         bsr      toDec
  444. X         clr.b    (a0)
  445. X
  446. X         bsr      refresh_add_gadget
  447. X         pull     d0-d2/d7/a0-a3/a6
  448. X         rts
  449. Xrefresh_y:
  450. X         push     d0-d2/d7/a0-a3/a6
  451. X         move.l   MyWindow2,a2   ; save things from being overwritten
  452. X         lea      YGadget,a3
  453. X
  454. X         btst.b   #MBB_JULIA,mb_flags(a4)
  455. X         bne.s    1$
  456. X         move.l   d0,mb_jy(a4)
  457. X1$:
  458. X         move.l   d0,d2
  459. X
  460. X         move.l   a2,a0          ; window
  461. X         move.l   a3,a1          ; gadget
  462. X         Base     Intuition
  463. X         Call     RemoveGadget   ; remove, modify, add back.
  464. X
  465. X         exg.l    d0,d2
  466. X
  467. X         move.l   gg_SpecialInfo(a3),a0
  468. X         move.l   si_Buffer(a0),a0
  469. X
  470. X         move.l   mb_dy(a4),d7   ; delta (see toDec why)
  471. X         bsr      toDec
  472. X         clr.b    (a0)
  473. X
  474. X         bsr      refresh_add_gadget
  475. X         pull     d0-d2/d7/a0-a3/a6
  476. X         rts
  477. Xrefresh_z:
  478. X         push     d0-d2/a0-a3/a6
  479. X         move.l   MyWindow2,a2   ; save thing from being overwritten
  480. X         lea      ZGadget,a3
  481. X         move.l   d0,d2
  482. X
  483. X         move.l   a2,a0          ; window
  484. X         move.l   a3,a1          ; gadget
  485. X         Base     Intuition
  486. X         Call     RemoveGadget   ; remove, modify, add back.
  487. X* Later we will insert this gadget back to its original place.
  488. X* That is why d2 gets position. toDec needs number in d0.
  489. X         exg.l    d0,d2
  490. X
  491. X         move.l   gg_SpecialInfo(a3),a0
  492. X         move.l   si_Buffer(a0),a0
  493. X
  494. X         move.b   #'+',d1
  495. X         tst.l    d0
  496. X         bpl.s    1$
  497. X         neg.l    d0
  498. X         move.b   #'-',d1
  499. X1$:
  500. X         move.b   d1,(a0)+
  501. X
  502. X         bsr      toMag
  503. X         clr.b    (a0)
  504. X
  505. X         bsr      refresh_add_gadget
  506. X
  507. X         cmp.b    #REDRAW,method
  508. X         bne.s    2$
  509. X         move.l   OldMagnify,d0
  510. X         move.l   d0,Magnify
  511. X         bsr      refresh_m         ; to show magnify is again normal
  512. X         move.b   #ZOOM,method      ; NOTE: this must be AFTER refresh_m
  513. X         bsr      refresh_zoom      ; does also DrawGrid
  514. X         bra.s    3$                ; so dont waste time doing it again
  515. X2$:
  516. X         bsr      DrawGrid
  517. X3$:
  518. X         pull     d0-d2/a0-a3/a6
  519. X         rts
  520. Xrefresh_i:
  521. X         push     d0-d2/a0-a3/a6
  522. X         move.l   MyWindow2,a2   ; save thing from being overwritten
  523. X         lea      IGadget,a3
  524. X         move.l   d0,d2
  525. X
  526. X         move.l   a2,a0          ; window
  527. X         move.l   a3,a1          ; gadget
  528. X         Base     Intuition
  529. X         Call     RemoveGadget   ; remove, modify, add back.
  530. X* Later we will insert this gadget back to its original place.
  531. X* That is why d2 gets position. toDec needs number in d0.
  532. X         exg.l    d0,d2
  533. X
  534. X         move.l   gg_SpecialInfo(a3),a0
  535. X         move.l   si_Buffer(a0),a0
  536. X
  537. X         bsr      toInt
  538. X         clr.b    (a0)
  539. X
  540. X         bsr.s    refresh_add_gadget
  541. X         pull     d0-d2/a0-a3/a6
  542. X         rts
  543. Xrefresh_m:
  544. X         push     d0-d2/a0-a3/a6
  545. X         move.l   MyWindow2,a2   ; save thing from being overwritten
  546. X         lea      MGadget,a3
  547. X         move.l   d0,d2
  548. X
  549. X         move.l   a2,a0          ; window
  550. X         move.l   a3,a1          ; gadget
  551. X         Base     Intuition
  552. X         Call     RemoveGadget   ; remove, modify, add back.
  553. X* Later we will insert this gadget back to its original place.
  554. X* That is why d2 gets position. toDec needs number in d0.
  555. X         exg.l    d0,d2
  556. X
  557. X         move.l   gg_SpecialInfo(a3),a0
  558. X         move.l   si_Buffer(a0),a0
  559. X
  560. X         bsr      toMag
  561. X         clr.b    (a0)
  562. X
  563. X         bsr.s    refresh_add_gadget
  564. X
  565. X         cmp.b    #ZOOM,method
  566. X         bne.s    1$
  567. X         move.b   #REDRAW,method
  568. X         bsr      refresh_zoom   ; does also DrawGrid,
  569. X         bra.s    2$             ; so dont repeat it.
  570. X1$:
  571. X         bsr      DrawGrid
  572. X2$:
  573. X         pull     d0-d2/a0-a3/a6
  574. X         rts
  575. X
  576. X* This is common to all above.
  577. Xrefresh_add_gadget:
  578. X         move.l   gg_SpecialInfo(a3),a0
  579. X         clr.w    si_BufferPos(a0)
  580. X         clr.w    si_DispPos(a0)
  581. X         move.l   a2,a0          ; window
  582. X         move.l   a3,a1          ; gadget
  583. X         move.l   d2,d0          ; the very same position
  584. X         Call     AddGadget
  585. X         move.l   a3,a0          ; gadget
  586. X         move.l   a2,a1          ; window
  587. X         sub.l    a2,a2          ; "requester / no requester"
  588. X         moveq    #1,d0
  589. X         Call     RefreshGList   ; actually just one
  590. X         rts
  591. X
  592. X* Hah haa! Still more refreshing routines:
  593. X
  594. Xrefresh_set:
  595. X         push     d0-d2/a0-a3/a5/a6
  596. X         Base     Intuition
  597. X         move.l   MyWindow2,a0
  598. X         move.l   a0,a5
  599. X         lea      MANDELGadget,a1
  600. X         move.l   a1,a3
  601. X         moveq    #2,d0
  602. X         Call     RemoveGList
  603. X
  604. X         lea      JULIAGadget,a1
  605. X         btst.b   #MBB_JULIA,mb_flags(a4)
  606. X         beq.s    it_is_mandel
  607. X
  608. X         or.w     #SELECTED,gg_Flags(a1)
  609. X         and.w    #~SELECTED,gg_Flags(a3)
  610. X         bra.s    put_them_back
  611. Xit_is_mandel:
  612. X         and.w    #~SELECTED,gg_Flags(a1)
  613. X         or.w     #SELECTED,gg_Flags(a3)
  614. Xput_them_back:
  615. X         move.l   a5,a0       ; window
  616. X         move.l   a3,a1       ; gadget
  617. X         sub.l    a2,a2       ; requester
  618. X         ; d0 is all right (RemoveGList...)
  619. X         moveq    #2,d1
  620. X         Call     AddGList
  621. X
  622. X         move.l   a3,a0       ; gadget
  623. X         move.l   a5,a1       ; window
  624. X         ; a2 is still 0. (Dunno if it should be 0 anyway?)
  625. X         moveq    #2,d0
  626. X         Call     RefreshGList
  627. X
  628. X         pull     d0-d2/a0-a3/a5/a6
  629. X         rts
  630. X
  631. Xrefresh_zoom:
  632. X         push     d0-d2/a0-a3/a5/a6
  633. X         Base     Intuition
  634. X         move.l   MyWindow2,a0
  635. X         move.l   a0,a5
  636. X         lea      ZOOMGadget,a1
  637. X         move.l   a1,a3
  638. X         moveq    #3,d0
  639. X         Call     RemoveGList
  640. X
  641. X         lea      DRAWGadget,a2
  642. X         lea      RESETGadget,a1
  643. X
  644. X         move.b   method,d1
  645. X         cmp.b    #REDRAW,d1
  646. X         beq.s    it_is_draw
  647. X         cmp.b    #RESET,d1
  648. X         beq.s    it_is_reset
  649. X
  650. X         or.w     #SELECTED,gg_Flags(a3)  ; zoom
  651. X         and.w    #~SELECTED,gg_Flags(a2)
  652. X         and.w    #~SELECTED,gg_Flags(a1)
  653. X         bra.s    complex_and_unique_label
  654. Xit_is_draw:
  655. X         and.w    #~SELECTED,gg_Flags(a3)
  656. X         or.w     #SELECTED,gg_Flags(a2)  ; draw
  657. X         and.w    #~SELECTED,gg_Flags(a1)
  658. X         bra.s    complex_and_unique_label
  659. Xit_is_reset:
  660. X         and.w    #~SELECTED,gg_Flags(a3)
  661. X         and.w    #~SELECTED,gg_Flags(a2)
  662. X         or.w     #SELECTED,gg_Flags(a1)  ; reset
  663. Xcomplex_and_unique_label:
  664. X         move.l   a5,a0       ; window
  665. X         move.l   a3,a1       ; gadget
  666. X         sub.l    a2,a2       ; requester
  667. X         ; d0 is all right (RemoveGList...)
  668. X         moveq    #3,d1
  669. X         Call     AddGList
  670. X
  671. X         move.l   a3,a0       ; gadget
  672. X         move.l   a5,a1       ; window
  673. X         ; a2 is still 0. (Dunno if it should be 0 anyway?)
  674. X         moveq    #3,d0
  675. X         Call     RefreshGList
  676. X
  677. X         pull     d0-d2/a0-a3/a5/a6
  678. X         bsr      DrawGrid          ; if something changed, show it.
  679. X         rts
  680. X
  681. X
  682. XGetSMagnify:
  683. X         move.b   (a0)+,d0
  684. X         cmp.b    #'+',d0
  685. X         beq.s    1$
  686. X         cmp.b    #'-',d0
  687. X         beq.s    2$
  688. X         subq.l   #1,a0
  689. X1$:
  690. X         bsr      GetMagnify
  691. X         rts
  692. X2$:
  693. X         bsr      GetMagnify
  694. X         beq.s    3$
  695. X         neg.l    d0
  696. X3$:
  697. X         rts
  698. X
  699. XRightButton:
  700. X         clr.b    method         ; == move.b #ZOOM,method
  701. X                                 ; so RMB is a shorthand for ZOOM
  702. X         bsr      refresh_zoom
  703. X         move.w   d5,d0
  704. X         move.w   d6,d1
  705. X
  706. X         push     d5/d6
  707. X         swap     d5
  708. X         swap     d6
  709. X         clr.w    d5
  710. X         clr.w    d6
  711. X         bsr      refresh_pos
  712. X         pull     d5/d6
  713. X
  714. X* a few words of explanation:
  715. X* Because we cannot process MOUSEMOVE events fast enough, we do
  716. X* the following: Loop CheckMessage, saving d5/d6 each turn,
  717. X* until it returns event that isn't of class MOUSEMOVE.
  718. X* Then process saved d5/d6 (they represent the position mouse was
  719. X* in BEFORE this message arrived).
  720. X* If message is of class NULL (no messages), start it all again.
  721. X
  722. Xrightloop:
  723. X         move.w   d5,tmpx
  724. X         move.w   d6,tmpy
  725. X         push     d0-d1
  726. X         bsr      CheckMessage
  727. X         pull     d0-d1
  728. X         bne      do_the_wrong_thing
  729. X
  730. Xwe_have_already_got_one:
  731. X         cmp.l    #MOUSEMOVE,d2
  732. X         beq.s    rightloop
  733. X
  734. X         push     d0-d2/d5/d6    ; so as not to trash current message
  735. X
  736. X* Uh oh... When I thought it would be nice if user could use
  737. X* magnification instead of deltas, I knew I would have to
  738. X* code 2^(-mag) in mach lang. But it never occured to me that
  739. X* I would have to code log2 somewhere....
  740. X* There is only one word to describe this: disqusting
  741. X         push     d0/d1          ; again!
  742. X         sub.w    tmpx,d0
  743. X         bpl.s    notneg1
  744. X         neg.w    d0
  745. Xnotneg1:
  746. X         sub.w    tmpy,d1
  747. X         bpl.s    notneg2
  748. X         neg.w    d1
  749. Xnotneg2:
  750. X         bne.s    r_isnonzero
  751. X         tst.w    d0
  752. X         beq.s    r_iszero
  753. Xr_isnonzero:
  754. X         move.w   mb_x2(a4),d2
  755. X         sub.w    mb_x1(a4),d2
  756. X         swap     d0
  757. X         clr.w    d0
  758. X         divu     d2,d0
  759. X         bvc.s    no_overf_1
  760. X         moveq    #-1,d0
  761. Xno_overf_1:
  762. X         move.w   mb_y2(a4),d2
  763. X         sub.w    mb_y1(a4),d2
  764. X         swap     d1
  765. X         clr.w    d1
  766. X         divu     d2,d1
  767. X         bvc.s    no_overf_2
  768. X         moveq    #-1,d1
  769. Xno_overf_2:
  770. X         cmp.w    d1,d0
  771. X         bhi.s    d0_is_higher
  772. X         move.w   d1,d0
  773. Xd0_is_higher:
  774. X         bsr      log2        ; I will code it later, ok?
  775. X         move.l   d0,Zoom
  776. Xr_iszero:
  777. X         pull     d0/d1
  778. X         move.w   tmpx,d5
  779. X         move.w   tmpy,d6
  780. X         add.w    d0,d5
  781. X         add.w    d1,d6
  782. X         swap     d5
  783. X         swap     d6
  784. X         clr.w    d5
  785. X         clr.w    d6
  786. X
  787. X         move.l   mb_dx(a4),d1
  788. X         move.l   mb_dy(a4),d2
  789. X         lsr.l    #1,d1
  790. X         lsr.l    #1,d2
  791. X
  792. X         lsr.l    #1,d5
  793. X         tst.w    d5
  794. X         bmi.s    1$
  795. X         moveq    #0,d1
  796. X1$:
  797. X         lsr.l    #1,d6
  798. X         tst.w    d6
  799. X         bmi.s    2$
  800. X         moveq    #0,d2
  801. X2$:
  802. X         move.l   d5,prex
  803. X         move.l   d6,prey
  804. X         swap     d5
  805. X         swap     d6
  806. X         bsr      Position
  807. X         add.l    d1,d5
  808. X         sub.l    d2,d6
  809. X         move.l   d5,CurrentX
  810. X         move.l   d6,CurrentY
  811. X         move.l   d5,d0
  812. X         bsr      refresh_x
  813. X         move.l   d6,d0
  814. X         bsr      refresh_y
  815. X         move.l   Zoom,d0
  816. X         bsr      refresh_z   ; This will do DrawGrid also.
  817. X         pull     d0-d2/d5/d6
  818. X         tst.l    d2
  819. X         bne.s    exit_right_button    ; probably MENUUP
  820. X
  821. X* How cute!!! LOVELY!!! Even here, this proggie refuses to busywait!!!!
  822. X         bsr      GetMessage     ; (ya see, no CheckMessage!)
  823. X         bne.s    do_the_wrong_thing
  824. X         cmp.l    #MOUSEMOVE,d2
  825. X         bne.s    exit_right_button
  826. X         move.w   d5,tmpx
  827. X         move.w   d6,tmpy
  828. X         bra      we_have_already_got_one
  829. X
  830. Xexit_right_button:
  831. X         moveq    #0,d0
  832. Xdo_the_wrong_thing:
  833. X         rts
  834. X
  835. Xrefresh_pos:
  836. X         push     d0
  837. X         move.l   d5,prex
  838. X         move.l   d6,prey
  839. X         swap     d5
  840. X         swap     d6
  841. X         bsr      Position
  842. X         move.l   d5,CurrentX
  843. X         move.l   d6,CurrentY
  844. X         move.l   d5,d0
  845. X         bsr      refresh_x
  846. X         move.l   d6,d0
  847. X         bsr      refresh_y
  848. X         bsr      DrawGrid
  849. X         pull     d0
  850. X         rts
  851. X
  852. XLeftButton:
  853. X         move.l   OldSecs,d0
  854. X         move.l   OldMicros,d1
  855. X         move.l   a2,d2
  856. X         move.l   a3,d3
  857. X         move.l   a2,OldSecs
  858. X         move.l   a3,OldMicros
  859. X         Call     DoubleClick
  860. X         tst.w    d0
  861. X         bne.s    left_double
  862. X
  863. X* We use a loop similar to RightButton's.
  864. Xleftloop
  865. X         move.w   d5,tmpx
  866. X         move.w   d6,tmpy
  867. X         bsr      CheckMessage
  868. X         bne      left_aborted   ; ^C
  869. Xleft_gotmessage
  870. X         cmp.l    #MOUSEMOVE,d2
  871. X         beq.s    leftloop
  872. X
  873. X         push     d5/d6
  874. X         swap     d5
  875. X         swap     d6
  876. X         clr.w    d5
  877. X         clr.w    d6
  878. X         bsr      refresh_pos
  879. X         pull     d5/d6
  880. X
  881. X         tst.l    d2
  882. X         bne.s    left_exit      ; probably SELECTUP
  883. X
  884. X         bsr      GetMessage
  885. X         bne.s    left_aborted
  886. X         cmp.l    #MOUSEMOVE,d2
  887. X         bne.s    left_exit
  888. X         move.w   d5,tmpx
  889. X         move.w   d6,tmpy
  890. X         bra      left_gotmessage
  891. Xleft_exit
  892. X         moveq    #FALSE,d0   ; return zero
  893. X         bra.s    left_return
  894. Xleft_double
  895. X         swap     d5
  896. X         swap     d6
  897. X         clr.w    d5
  898. X         clr.w    d6
  899. X         bsr      refresh_pos
  900. X         moveq    #TRUE,d0    ; return positive nonzero
  901. X         bra.s    left_return
  902. Xleft_aborted
  903. X         moveq    #-TRUE,d0   ; return negative nonzero
  904. Xleft_return
  905. X         rts
  906. X
  907. X
  908. X* Converts an integer from d0.w to a string (a0)+.
  909. X* Grr.. Why don't we have most significant digit last?
  910. XtoInt:
  911. X         push     d0-d2
  912. X         move.w   #10000,d1
  913. X         moveq    #FALSE,d2
  914. X1$:
  915. X         and.l    #$ffff,d0
  916. X         divu     d1,d0
  917. X         bne.s    4$
  918. X         tst.w    d2    ; discard leading zeros
  919. X         beq.s    2$
  920. X4$:
  921. X         add.b    #'0',d0
  922. X         move.b   d0,(a0)+
  923. X         moveq    #TRUE,d2
  924. X2$:
  925. X         swap     d0
  926. X         ext.l    d1
  927. X         divu     #10,d1
  928. X         bne.s    1$
  929. X
  930. X         tst.w    d2
  931. X         bne.s    3$
  932. X         move.b   #'0',(a0)+  ; if d0=0, display at least a 0.
  933. X3$:
  934. X         pull     d0-d2
  935. X         rts
  936. X
  937. X* Still one more conversion routine. (for Magnify's internal format)
  938. XtoMag:
  939. X         push     d0-d2
  940. X         move.l   d0,d1
  941. X         swap     d0
  942. X         bsr.s    toInt
  943. X         move.b   #'.',(a0)+
  944. X
  945. X         moveq    #3,d2
  946. X1$:
  947. X         mulu     #10,d1
  948. X         swap     d1
  949. X         add.b    #'0',d1
  950. X         move.b   d1,(a0)+
  951. X         swap     d1
  952. X         dbf      d2,1$
  953. X
  954. X         tst.w    d1
  955. X         bpl.s    2$       ; if < $8000, no rounding needed
  956. X         bsr      Round
  957. X2$:
  958. X         pull     d0-d2
  959. X         rts
  960. X
  961. X
  962. XdispCoords:
  963. X* This routine displays the coordinates of current mouse position
  964. X* in screen title bar.
  965. X         bsr.s    Position
  966. X         lea      CoordText,a0
  967. X         move.l   d5,d0
  968. X         move.l   mb_dx(a4),d7
  969. X         bsr.s    toDec
  970. X         move.b   #' ',(a0)+
  971. X         move.l   d6,d0
  972. X         move.l   mb_dy(a4),d7
  973. X         bsr.s    toDec
  974. X         clr.b    (a0)+
  975. X* There was a time when I used SetWindowTitles here.
  976. X* But the flashing... and the speed (or rather lack of)...
  977. X
  978. X         move.l   MyScreen,a0
  979. X         lea      sc_RastPort(a0),a0
  980. X         lea      Coords,a1
  981. X         moveq    #80,d0
  982. X         moveq    #0,d1
  983. X         Call     PrintIText
  984. X
  985. X         rts
  986. X
  987. X* Fetch absolute position in complex plane when d5/d6 has
  988. X* mouse position. Return result also in d5/d6.
  989. XPosition:
  990. X         push     d0
  991. X         move.w   d5,d0
  992. X         mulu     mb_dx(a4),d5
  993. X         swap     d5
  994. X         clr.w    d5
  995. X         mulu     2+mb_dx(a4),d0
  996. X         add.l    d0,d5
  997. X         add.l    mb_x0(a4),d5
  998. X
  999. X         move.w   d6,d0
  1000. X         mulu     mb_dy(a4),d6
  1001. X         swap     d6
  1002. X         clr.w    d6
  1003. X         mulu     2+mb_dy(a4),d0
  1004. X         add.l    d0,d6
  1005. X         neg.l    d6
  1006. X         add.l    mb_y0(a4),d6
  1007. X         pull     d0
  1008. X
  1009. X         rts
  1010. X
  1011. X* toDec is the reverse of GetFixed. I will use a couple look-up tables
  1012. X* here, too.
  1013. X* INPUTS fixed point in d0, buffer in a0, delta in d7.
  1014. X* RETURN next a0 in a0.
  1015. X
  1016. XtoDec:
  1017. X         push     a1-a3/d0-d6
  1018. X         move.b   #'+',d2
  1019. X         tst.l    d0
  1020. X         bpl.s    1$
  1021. X
  1022. X         move.b   #'-',d2
  1023. X         neg.l    d0
  1024. X1$:      move.b   d2,(a0)+
  1025. X
  1026. X         move.b   #'0',d2
  1027. X3$:      cmp.l    #$20000000,d0
  1028. X         blo.s    2$
  1029. X         sub.l    #$20000000,d0
  1030. X         addq.b   #1,d2
  1031. X         bra.s    3$
  1032. END_OF_FILE
  1033. if test 25782 -ne `wc -c <'source/gui.asm.ab'`; then
  1034.     echo shar: \"'source/gui.asm.ab'\" unpacked with wrong size!
  1035. fi
  1036. # end of 'source/gui.asm.ab'
  1037. fi
  1038. if test -f 'source/gui.asm.ac' -a "${1}" != "-c" ; then 
  1039.   echo shar: Will not clobber existing file \"'source/gui.asm.ac'\"
  1040. else
  1041. echo shar: Extracting \"'source/gui.asm.ac'\" \(26047 characters\)
  1042. sed "s/^X//" >'source/gui.asm.ac' <<'END_OF_FILE'
  1043. X2$:
  1044. X         move.b   d2,(a0)+
  1045. X         move.b   #'.',(a0)+
  1046. X
  1047. X         lea      4+NumberHi,a1
  1048. X         lea      4+NumberLo,a2
  1049. X         move.l   #-1,a3         ; for precision determining.
  1050. X         moveq    #0,d1          ; use 64 bits of precision (SHIT! why?)
  1051. Xouterloop:
  1052. X         move.b   #'0',d2
  1053. X         move.l   (a1)+,d3
  1054. X         move.l   (a2)+,d4
  1055. Xinnerloop:
  1056. X         move.l   d0,d5
  1057. X         move.l   d1,d6
  1058. X         sub.l    d4,d6
  1059. X         subx.l   d3,d5
  1060. X         bmi.s    below0
  1061. X         move.l   d5,d0
  1062. X         move.l   d6,d1
  1063. X         addq.b   #1,d2
  1064. X         bra.s    innerloop
  1065. Xbelow0:
  1066. X         cmp.l    a3,d7
  1067. X         move.l   -4(a1),a3
  1068. X         bhi.s    it_is_over  ; it sayz: being too accurate
  1069. X         move.b   d2,(a0)+
  1070. X         bra.s    outerloop
  1071. Xit_is_over:
  1072. X
  1073. X* Now we round the number. This was added because it was frustrating
  1074. X* when user entered, say, 0.7 and got back 0.69.
  1075. X* This is an ascii round.
  1076. X         cmp.b    #'5',d2
  1077. X         blo.s    no_round
  1078. X         bsr.s    Round
  1079. X
  1080. Xno_round:
  1081. X         pull     a1-a3/d0-d6
  1082. X         rts
  1083. X
  1084. X* This is an ASCII round.
  1085. XRound:   push     a0/d0
  1086. X1$:      move.b   -(a0),d0
  1087. X         cmp.b    #'.',d0
  1088. X         beq.s    1$
  1089. X         cmp.b    #'9',d0
  1090. X         bne.s    2$
  1091. X         move.b   #'0',(a0)
  1092. X         bra.s    1$
  1093. X2$:
  1094. X         addq.b   #1,(a0)
  1095. X         pull     a0/d0
  1096. X         rts
  1097. X
  1098. X* Wait() for an IDCMP message from either of the windows,
  1099. X* or timer I/O to complete.
  1100. X* Handle ^C explicitely.
  1101. X
  1102. XGetMessage:
  1103. X         push     d0-d1/a0-a1
  1104. X
  1105. Xtest_messages:
  1106. X         bsr      CheckMessage
  1107. X         bne.s    found_one      ; of class ^C
  1108. X         tst.l    d2             ; which class? (0 = none found)
  1109. X         bne.s    set_Z_exit
  1110. X
  1111. X* No messages. Wait for them.
  1112. X         bset     #SIGBREAKB_CTRL_C,d0
  1113. X         Base     Exec
  1114. X         Call     Wait
  1115. X         btst     #SIGBREAKB_CTRL_C,d0
  1116. X         bne.s    found_one      ; ^C (return with Z clear)
  1117. X
  1118. X         bra.s    test_messages  ; Now there's a message for us. Fetch it.
  1119. Xset_Z_exit:
  1120. X         moveq    #0,d0
  1121. Xfound_one:
  1122. X         pull     d0-d1/a0-a1
  1123. X         rts
  1124. X
  1125. X* This routine just gets a message if it IS here, but does not
  1126. X* Wait() for it. However, returns with signal mask in d0 if
  1127. X* caller wishes to wait.
  1128. X
  1129. XCheckMessage:
  1130. X* Test if any messages arrived
  1131. X         Base     Exec
  1132. X         moveq    #0,d2             ; Signal mask
  1133. X
  1134. X* First window
  1135. X         move.l   MyWindow1,a0      ; This is always open
  1136. X         move.l   wd_UserPort(a0),a0
  1137. X         move.b   MP_SIGBIT(a0),d0
  1138. X         bset     d0,d2
  1139. X         Call     GetMsg
  1140. X         tst.l    d0
  1141. X         bne.s    foundmsg
  1142. X
  1143. X* Second window
  1144. X         move.l   MyWindow2,a0
  1145. X         move.l   a0,d0
  1146. X         beq.s    1$                ; check if open
  1147. X         move.l   wd_UserPort(a0),a0
  1148. X         move.b   MP_SIGBIT(a0),d0
  1149. X         bset     d0,d2
  1150. X         Call     GetMsg
  1151. X         tst.l    d0
  1152. X         bne.s    foundmsg
  1153. X1$:
  1154. X* Timer I/O
  1155. X         move.l   UseReq,a1
  1156. X         move.l   a1,d0
  1157. X         beq.s    2$          ; no request pending
  1158. X         move.l   MN_REPLYPORT(a1),a0
  1159. X         move.b   MP_SIGBIT(a0),d0
  1160. X         bset     d0,d2
  1161. X         Call     CheckIO
  1162. X         tst.l    d0
  1163. X         bne.s    foundio
  1164. X2$:
  1165. X* No messages! Return with 0 in d2, signal set in d0.
  1166. X         exg.l    d0,d2
  1167. X         rts
  1168. X
  1169. Xfoundmsg:
  1170. X         move.l   d0,a1
  1171. X         move.l   im_Class(a1),d2
  1172. X         move.w   im_Code(a1),d3
  1173. X         move.w   im_Qualifier(a1),d4
  1174. X         move.l   im_IAddress(a1),a5
  1175. X         move.w   im_MouseX(a1),d5
  1176. X         move.w   im_MouseY(a1),d6
  1177. X         move.l   im_Seconds(a1),a2
  1178. X         move.l   im_Micros(a1),a3
  1179. X         Call     ReplyMsg
  1180. X         cmp.l    #RAWKEY,d2
  1181. X         bne.s    nobreak
  1182. X         cmp.w    #$33,d3      ; RAW keycode for 'c'
  1183. X         bne.s    nobreak
  1184. X         btst     #IEQUALIFIERB_CONTROL,d4
  1185. X         beq.s    nobreak
  1186. Xbreak:
  1187. X         moveq    #TRUE,d0
  1188. X         rts
  1189. Xfoundio:
  1190. X         move.l   UseReq,a1
  1191. X         Call     WaitIO
  1192. X         clr.l    UseReq
  1193. X         moveq    #FAKECLASS,d2
  1194. Xnobreak:
  1195. X         moveq    #FALSE,d0
  1196. X         rts
  1197. X
  1198. XTransform:
  1199. X* Firsty: Magnify is useless to brot. Need to calculate
  1200. X* 2 ^ (-Magnify). That, again, is very very inconvenient.
  1201. X
  1202. X* Lets do it in a subroutine. Someone else might need it.
  1203. X         move.w   #$2000,d0
  1204. X         moveq    #$0000,d1   ; d0/d1 form 1 (fixed),
  1205. X         moveq    #$0000,d2   ; d2 is just extension
  1206. X         move.l   Magnify,d3
  1207. X         bsr.s    Power2
  1208. X
  1209. X         ifeq     SCREEN-0
  1210. X         move.l   d0,mb_dx(a4)
  1211. X         move.l   d0,mb_dy(a4)
  1212. X         endc
  1213. X         ifeq     SCREEN-1
  1214. X         asr.l    #1,d0
  1215. X         move.l   d0,mb_dx(a4)
  1216. X         asl.l    #1,d0
  1217. X         move.l   d0,mb_dy(a4)
  1218. X         endc
  1219. X         ifeq     SCREEN-2
  1220. X         asr.l    #1,d0
  1221. X         move.l   d0,mb_dy(a4)
  1222. X         asl.l    #1,d0
  1223. X         move.l   d0,mb_dx(a4)
  1224. X         endc
  1225. X         ifeq     SCREEN-3
  1226. X         asr.l    #1,d0
  1227. X         move.l   d0,mb_dx(a4)
  1228. X         move.l   d0,mb_dy(a4)
  1229. X         endc
  1230. X
  1231. X* 'brot' expects to see z = x0 + y0 i to be upper lefthand corner
  1232. X* whereas this program has until now assumed it is centerpoint.
  1233. X* I wont use mulX instructions here because we are not in such a
  1234. X* hurry. And secondly, on low magnification levels this is more
  1235. X* accurate. (OK, that sounded nice. The real reason was that
  1236. X* I am too lazy to find out what was wrong with that mulu!)
  1237. X
  1238. X         move.w   mb_x1(a4),d0
  1239. X         add.w    mb_x2(a4),d0
  1240. X         move.l   CurrentX,d1
  1241. X         move.l   mb_dx(a4),d2
  1242. X         lsr.w    #1,d0
  1243. X         bcc.s    1$
  1244. X
  1245. X         move.l   d2,d3
  1246. X         asr.l    #1,d3
  1247. X         sub.l    d3,d1
  1248. X1$:
  1249. X         tst.w    d0
  1250. X         beq.s    2$
  1251. X         sub.l    d2,d1
  1252. X         subq.w   #1,d0
  1253. X         bra.s    1$
  1254. X2$:      move.l   d1,mb_x0(a4)
  1255. X
  1256. X         move.w   mb_y1(a4),d0
  1257. X         add.w    mb_y2(a4),d0
  1258. X         move.l   CurrentY,d1
  1259. X         move.l   mb_dy(a4),d2
  1260. X         lsr.w    #1,d0
  1261. X         bcc.s    3$
  1262. X
  1263. X         move.l   d2,d3
  1264. X         asr.l    #1,d3
  1265. X         add.l    d3,d1
  1266. X3$:
  1267. X         tst.w    d0
  1268. X         beq.s    4$
  1269. X         add.l    d2,d1
  1270. X         subq.w   #1,d0
  1271. X         bra.s    3$
  1272. X4$:      move.l   d1,mb_y0(a4)
  1273. X
  1274. X         rts
  1275. X
  1276. XPower2:
  1277. X* I must be a masochist...
  1278. X* Right now I have no idea how to code this routine. Hm. let's see.
  1279. X
  1280. X* This routine should be called with Magnify (or Zoom) in d3.
  1281. X* d0/d1/d2 should be set to value to be multiplied by 2^(-d3).
  1282. X* Returns d0.
  1283. X
  1284. X         push     d1-d4/a0
  1285. X
  1286. X* I seem to break the calculation into smaller ones, like
  1287. X* 2^(-1) x 2^(-1) x ... x 2^(-1) x 2^(-1/2) x 2^(-1/4) x ...
  1288. X* Each bit corresponds to one multiplication.
  1289. X
  1290. X         swap     d3
  1291. X         tst.w    d3
  1292. Xminusone:
  1293. X         beq.s    skip_power
  1294. X         lsr.w    #1,d0    ; This is  x 2^(-1)
  1295. X         roxr.w   #1,d1
  1296. X         roxr.w   #1,d2
  1297. X         subq.w   #1,d3
  1298. X         bra.s    minusone
  1299. Xskip_power:
  1300. X
  1301. X         swap     d3
  1302. X         lea      NumberP,a0
  1303. Xminusfrac:
  1304. X         move.w   (a0)+,d4
  1305. X         asl.w    #1,d3
  1306. X         bcc.s    dont_multi
  1307. X
  1308. X         mulu     d4,d0
  1309. X         mulu     d4,d1
  1310. X         mulu     d4,d2
  1311. X         swap     d2
  1312. X         add.w    d1,d2
  1313. X         swap     d1
  1314. X         addx.w   d0,d1
  1315. X         swap     d0
  1316. X         moveq    #0,d4
  1317. X         addx.w   d4,d0
  1318. Xdont_multi:
  1319. X         tst.w    d3
  1320. X         bne    minusfrac
  1321. X
  1322. X* Ha! It was easy!
  1323. X         swap     d0
  1324. X         move.w   d1,d0
  1325. X
  1326. X         pull     d1-d4/a0
  1327. X         rts
  1328. X
  1329. X* Oooooh how I wish I had a C-compiler!
  1330. X* Inverse of Power2, that is,
  1331. X* log  ( d2 )  in zoom/magnify fixed point format.
  1332. X*    2
  1333. Xlog2:
  1334. X         push     d1-d4/a0
  1335. X         moveq    #0,d1       ; this gets the answer
  1336. Xlog_int:
  1337. X         tst.w    d0
  1338. X         bmi.s    log_frac
  1339. X         addq.w   #1,d1
  1340. X         lsl.w    #1,d0
  1341. X         bra.s    log_int
  1342. Xlog_frac:
  1343. X         swap     d1
  1344. X         lea      NumberL,a0
  1345. X         moveq    #15,d2
  1346. Xlog_loop:
  1347. X         lsl.w    #1,d1       ; go through 16 bits
  1348. X         move.w   (a0)+,d3
  1349. X         moveq    #0,d4
  1350. X         move.w   d0,d4
  1351. X         swap     d4
  1352. X         mulu     d0,d3
  1353. X         add.l    d3,d4
  1354. X         bcs.s    log_overflow
  1355. X* That multiplication was "valid" -> record intermediate result
  1356. X* in d0. Bit in d1 collects final result.
  1357. X         or.b     #1,d1
  1358. X         swap     d4
  1359. X         bpl.s    1$
  1360. X         add.w    #1,d4
  1361. X1$:
  1362. X         move.w   d4,d0
  1363. Xlog_overflow:
  1364. X         dbf      d2,log_loop
  1365. X         move.l   d1,d0
  1366. X         pull     d1-d4/a0
  1367. X
  1368. X* AMAZING! UNBELIEVABLE! I think I got it right THE VERY FIRST TIME
  1369. X* I CODED IT! This must have been the 1st routine that didnt
  1370. X* need to be debugged! And I thought this would be hard...
  1371. X
  1372. X         rts
  1373. X
  1374. X
  1375. XCtrlC:
  1376. X         push     a0-a1/d0-d1/a6
  1377. X         Base     Exec
  1378. X         move.l   MyWindow1,a0
  1379. X         move.l   wd_UserPort(a0),a0
  1380. X         Call     GetMsg
  1381. X         tst.l    d0
  1382. X         beq.s    no_c
  1383. X         move.l   d0,a1
  1384. X         cmp.l    #RAWKEY,im_Class(a1)
  1385. X         bne.s    reply_c
  1386. X         cmp.w    #$33,im_Code(a1)
  1387. X         bne.s    reply_c
  1388. X         move.w   im_Qualifier(a1),d0
  1389. X         btst     #IEQUALIFIERB_CONTROL,d0
  1390. X         beq.s    reply_c
  1391. X         Call     ReplyMsg
  1392. X         moveq    #-1,d0
  1393. X         bra.s    exit_c
  1394. Xreply_c:
  1395. X         Call     ReplyMsg
  1396. Xno_c:
  1397. X         moveq    #0,d0
  1398. X         moveq    #0,d1
  1399. X         Call     SetSignal
  1400. X         btst     #SIGBREAKB_CTRL_C,d0
  1401. Xexit_c:
  1402. X         pull     a0-a1/d0-d1/a6
  1403. X         rts
  1404. X
  1405. X
  1406. X
  1407. X* This routine gets decimal number ( -4.0 .. 4.0 ) from (a0)+ to d0.
  1408. X* Format is fixed point.
  1409. X
  1410. X* If Z bit is set (indicating zero result) no number was found.
  1411. X
  1412. X* This may be one of the stupidest routines I've written. But
  1413. X* it doesnot matter. This way I will always be accurate enough.
  1414. X* (For those meatheads that do not understand what I mean:
  1415. X* I use internally 64 bits of precision, the final result
  1416. X* will have only 32...)
  1417. X
  1418. XGetFixed:
  1419. X         push     a1-a3/d1-d5
  1420. X         move.l   a0,a3
  1421. X         moveq    #0,d1
  1422. X         moveq    #0,d3
  1423. X         move.l   #$80000000,d2
  1424. X         lea      NumberHi,a1
  1425. X         lea      NumberLo,a2
  1426. X1$:
  1427. X         move.b   (a0)+,d0
  1428. X         cmp.b    #'+',d0
  1429. X         beq.s    1$
  1430. X         cmp.b    #'-',d0
  1431. X         bne.s    2$
  1432. X         bset     #15,d3   ; Now this is negative
  1433. X         bra.s    1$
  1434. X2$:
  1435. X         cmp.b    #'.',d0
  1436. X         bne.s    3$
  1437. X         bset     #7,d3    ; Remember: now we have gone past
  1438. X         bra.s    1$
  1439. X3$:
  1440. X         cmp.b    #'0',d0
  1441. X         blo.s    4$
  1442. X         cmp.b    #'9',d0
  1443. X         bhi.s    4$
  1444. X
  1445. X         bset     #0,d3
  1446. X         cmp.l    (a1)+,(a2)+ ; go to next number position
  1447. X         tst.b    d3
  1448. X         bmi.s    5$
  1449. X         lea      NumberHi,a1 ; We will patiently stuck with these until
  1450. X         lea      NumberLo,a2 ; decimal point found
  1451. X5$:
  1452. X         sub.b    #'0'+1,d0
  1453. X         bmi.s    1$
  1454. X         ext.w    d0
  1455. X         move.l   (a1),d4
  1456. X         move.l   (a2),d5
  1457. X6$:
  1458. X         add.l    d5,d2
  1459. X         addx.l   d4,d1
  1460. X         dbf      d0,6$
  1461. X         bra.s    1$
  1462. X
  1463. X4$:
  1464. X         subq.l   #1,a0
  1465. X         bsr.s    SkipBlk
  1466. X         tst.w    d3
  1467. X         bpl.s    7$
  1468. X         neg.l    d1
  1469. X7$:
  1470. X         move.l   d1,d0
  1471. X         btst     #0,d3
  1472. X         bne.s    8$
  1473. X         move.l   a3,a0 ; if error, go to where we started from
  1474. X8$:
  1475. X         pull     a1-a3/d1-d5
  1476. X         rts
  1477. X
  1478. X* This routine gets number from (a0)+ to d0.w
  1479. X
  1480. XGetNum:
  1481. X         push     d1/d2/a1
  1482. X         move.l   a0,a1
  1483. X         moveq    #FALSE,d2      ; no valid number yet
  1484. X         moveq    #0,d0
  1485. X2$:
  1486. X         move.b   (a0)+,d1
  1487. X         cmp.b    #'0',d1
  1488. X         blo.s    1$
  1489. X         cmp.b    #'9',d1
  1490. X         bhi.s    1$
  1491. X
  1492. X         sub.b    #'0',d1
  1493. X         ext.w    d1
  1494. X         mulu     #10,d0
  1495. X         add.w    d1,d0
  1496. X         moveq    #TRUE,d2       ; valid number
  1497. X         bra.s    2$
  1498. X
  1499. X1$:
  1500. X         subq.l   #1,a0
  1501. X         bsr.s    SkipBlk
  1502. X
  1503. X         tst.w    d2          ; invalid?
  1504. X         bne.s    3$
  1505. X         move.l   a1,a0       ; if error, get back where to we started from
  1506. X3$:
  1507. X         pull     d1/d2/a1
  1508. X         rts
  1509. X
  1510. X* This will skip all spaces and tabs.
  1511. X
  1512. XSkipBlk:
  1513. X         push     d0
  1514. X1$:
  1515. X         move.b   (a0)+,d0
  1516. X         cmp.b    #' ',d0
  1517. X         beq.s    1$
  1518. X         subq.l   #1,a0
  1519. X         pull     d0
  1520. X         rts
  1521. X
  1522. X* A subroutine for each of the options
  1523. Xopt_x:   bsr      GetFixed
  1524. X         beq.s    opt_xx
  1525. X         move.l   d0,CurrentX
  1526. X         moveq    #TRUE,d0
  1527. X         rts
  1528. Xopt_xx
  1529. X* This is just -x meaning exit when drawn.
  1530. X         clr.b    inter
  1531. X         moveq    #TRUE,d0
  1532. X         rts
  1533. X
  1534. Xopt_y:   bsr      GetFixed
  1535. X         beq.s    1$
  1536. X         move.l   d0,CurrentY
  1537. X         moveq    #TRUE,d0
  1538. X1$:      rts
  1539. X
  1540. X* This option is a very special one (internally) because it uses
  1541. X* still one different number format (scaled by 2^16).
  1542. X* This is converted to actual mb_dx and mb_dy values later...
  1543. Xopt_m:   bsr.s    GetMagnify
  1544. X         beq.s    opt_mm
  1545. X         move.l   d0,Magnify
  1546. X         moveq    #TRUE,d0
  1547. X         rts
  1548. Xopt_mm
  1549. X* This is only -m meaning mandelbrot sets
  1550. X         bclr.b   #MBB_JULIA,mb_flags(a4)
  1551. X         moveq    #TRUE,d0
  1552. X         rts
  1553. X
  1554. XGetMagnify:
  1555. X         push     a1-a2/d1-d2
  1556. X         move.l   a1,a2
  1557. X         bsr      GetNum
  1558. X         swap     d0             ; integer part go to high 16 bits
  1559. X         cmp.b    #'.',(a0)+
  1560. X         bne.s    m_space        ; number had ONLY integer part
  1561. X         moveq    #0,d1          ; collect number here
  1562. X         moveq    #0,d2          ; clear extra bits
  1563. X         clr.w    d0
  1564. Xm_find_end:
  1565. X         move.b   (a0)+,d2
  1566. X         addq.w   #1,d0          ; low word has a temporary role as counter
  1567. X         cmp.b    #'0',d2
  1568. X         blo.s    m_end_found
  1569. X         cmp.b    #'9',d2
  1570. X         bls.s    m_find_end
  1571. Xm_end_found:
  1572. X         lea      -1(a0),a1
  1573. Xm_loop:
  1574. X         subq.w   #1,d0
  1575. X         beq.s    m_got_it
  1576. X         move.b   -(a1),d2
  1577. X         sub.b    #'0',d2
  1578. X         swap     d1
  1579. X         move.w   d2,d1
  1580. X         swap     d1
  1581. X         divu     #10,d1
  1582. X         bra.s    m_loop
  1583. Xm_got_it:
  1584. X         move.w   d1,d0
  1585. X
  1586. Xm_space:
  1587. X         subq.l   #1,a0
  1588. X         bsr      SkipBlk
  1589. X         cmp.l    #$001d0000,d0  ; greater than 2^29?
  1590. X         bhi.s    m_error
  1591. X         moveq    #TRUE,d1
  1592. X         bra.s    m_exit
  1593. Xm_error:
  1594. X         moveq    #FALSE,d0
  1595. X         move.l   a2,a1
  1596. Xm_exit:  pull     a1-a2/d1-d2
  1597. X         rts
  1598. X
  1599. X
  1600. Xopt_i:   bsr      GetNum
  1601. X         beq.s    1$
  1602. X         move.w   d0,mb_i(a4)
  1603. X         moveq    #TRUE,d0
  1604. X1$:      rts
  1605. X
  1606. X
  1607. Xopt_l:   bclr.b   #MBB_AUTOPREC,mb_flags(a4)
  1608. X         bclr.b   #MBB_HIGH,mb_flags(a4)
  1609. X         moveq    #TRUE,d0
  1610. X         rts
  1611. X
  1612. Xopt_h:   bclr.b   #MBB_AUTOPREC,mb_flags(a4)
  1613. X         bset.b   #MBB_HIGH,mb_flags(a4)
  1614. X         moveq    #TRUE,d0
  1615. X         rts
  1616. X
  1617. Xopt_a:   bset.b   #MBB_AUTOPREC,mb_flags(a4)
  1618. X         moveq    #TRUE,d0
  1619. X         rts
  1620. X
  1621. X
  1622. Xopt_c:   bclr.b   #MBB_AUTOCRAWL,mb_flags(a4)
  1623. X         bset.b   #MBB_CRAWL,mb_flags(a4)
  1624. X         moveq    #TRUE,d0
  1625. X         rts
  1626. X
  1627. Xopt_w:   bclr.b   #MBB_AUTOCRAWL,mb_flags(a4)
  1628. X         bclr.b   #MBB_CRAWL,mb_flags(a4)
  1629. X         moveq    #TRUE,d0
  1630. X         rts
  1631. X
  1632. Xopt_p:   bset.b   #MBB_AUTOCRAWL,mb_flags(a4)
  1633. X         moveq    #TRUE,d0
  1634. X         rts
  1635. X
  1636. Xopt_g:   move.b   #TRUE,inter
  1637. X         rts
  1638. X
  1639. X
  1640. Xopt_j:   move.b   (a0)+,d0
  1641. X         toupper  d0
  1642. X
  1643. X         cmp.b    #'X',d0
  1644. X         bne.s    j_no_x
  1645. Xopt_jx      ; WB options enter this routine here
  1646. X         bsr      GetFixed
  1647. X         beq.s    1$
  1648. X         move.l   d0,mb_jx(a4)
  1649. X         moveq    #TRUE,d0
  1650. X1$:      rts
  1651. X
  1652. Xj_no_x:  cmp.b    #'Y',d0
  1653. X         bne.s    j_no_y
  1654. Xopt_jy      ; WB entry point
  1655. X         bsr      GetFixed
  1656. X         beq.s    1$
  1657. X         move.l   d0,mb_jy(a4)
  1658. X         moveq    #TRUE,d0
  1659. X1$:      rts
  1660. X
  1661. X
  1662. Xj_no_y
  1663. X* This is just -j meaning julia sets
  1664. X         subq.l   #1,a0
  1665. Xopt_jj      ; WB entry
  1666. X         bset.b   #MBB_JULIA,mb_flags(a4)
  1667. X         moveq    #TRUE,d0
  1668. X         rts
  1669. X
  1670. Xopt_s
  1671. X         lea      NameBuffer,a1
  1672. Xs_endstr
  1673. X         move.b   (a0)+,d0
  1674. X         beq.s    s_over
  1675. X         cmp.b    #' ',d0
  1676. X         beq.s    s_over
  1677. X         move.b   d0,(a1)+
  1678. X         bra.s    s_endstr
  1679. Xs_over
  1680. X         subq.l   #1,a0
  1681. X         clr.b    (a1)
  1682. X         move.l   a1,NameEnd
  1683. X         bsr      SkipBlk
  1684. X         move.b   #TRUE,d0
  1685. X         move.b   d0,saveit
  1686. X         rts
  1687. X
  1688. X
  1689. X* For WB use, e.g. FLAGS=xc\0
  1690. Xopt_flags
  1691. X         move.b   (a0)+,d0
  1692. X         beq.s    no_more_flags
  1693. X         toupper  d0
  1694. X
  1695. X* This will return use in this routine.
  1696. X         pea      opt_flags
  1697. X         cmp.b    #'L',d0
  1698. X         beq      opt_l
  1699. X         cmp.b    #'H',d0
  1700. X         beq      opt_h
  1701. X         cmp.b    #'A',d0
  1702. X         beq      opt_a
  1703. X         cmp.b    #'C',d0
  1704. X         beq      opt_c
  1705. X         cmp.b    #'W',d0
  1706. X         beq      opt_w
  1707. X         cmp.b    #'P',d0
  1708. X         beq      opt_p
  1709. X         cmp.b    #'G',d0
  1710. X         beq      opt_g
  1711. X         cmp.b    #'J',d0
  1712. X         beq      opt_jj      ; not opt_j
  1713. X         cmp.b    #'M',d0
  1714. X         beq      opt_mm      ; not opt_m
  1715. X         cmp.b    #'X',d0
  1716. X         beq      opt_xx      ; not opt_x
  1717. X* Wrong option!
  1718. X         addq.l   #4,a7
  1719. X         moveq    #FALSE,d0
  1720. X         rts
  1721. Xno_more_flags
  1722. X         moveq    #TRUE,d0
  1723. X         rts
  1724. X
  1725. XSavePicture:
  1726. X         lea      NameBuffer,a0
  1727. X         move.l   a0,d2
  1728. X
  1729. X         move.l   NameEnd,a0
  1730. X         move.w   Counter,d0
  1731. X         beq.s    first_time
  1732. X* When 2nd etc. file saved, use a running number as an identifier
  1733. X         bsr      toInt
  1734. X         clr.b    (a0)        ; 0 terminates string
  1735. Xfirst_time:
  1736. X         addq.w   #1,Counter
  1737. X
  1738. X         lea      _IffLib,a1
  1739. X         moveq    #0,d0
  1740. X         Base     Exec
  1741. X         Call     OpenLibrary
  1742. X         tst.l    d0
  1743. X         beq.s    noifflib
  1744. X         move.l   d0,a6
  1745. X
  1746. X         move.l   MyScreen,a0
  1747. X         move.l   sc_ViewPort+vp_ColorMap(a0),a2
  1748. X         move.l   cm_ColorTable(a2),a2          ; colortable
  1749. X         move.l   sc_RastPort+rp_BitMap(a0),a1  ; bitmap
  1750. X         move.l   d2,a0                         ; filename
  1751. X
  1752. X         move.w   mb_x1(a4),d1
  1753. X         move.w   mb_y1(a4),d2
  1754. X         move.w   mb_x2(a4),d3
  1755. X         move.w   mb_y2(a4),d4
  1756. X
  1757. X         lsr.w    #3,d1       ; no of BYTES
  1758. X         add.w    #7,d3
  1759. X         lsr.w    #3,d3
  1760. X
  1761. X         sub.w    d1,d3
  1762. X         sub.w    d2,d4
  1763. X         addq.w   #1,d3       ; width and heigth
  1764. X         addq.w   #1,d4
  1765. X
  1766. X         moveq    #1,d0       ; run-length compression
  1767. X
  1768. X         jsr      SaveClip(a6)
  1769. X         move.l   d0,d2
  1770. X
  1771. X         move.l   a6,a1
  1772. X         Base     Exec
  1773. X         Call     CloseLibrary
  1774. X
  1775. X         tst.l    d2
  1776. X         bne.s    exit_save
  1777. X         move.b   #ERROR_ifflib,error
  1778. X         bra.s    exit_save
  1779. Xnoifflib:
  1780. X         move.b   #ERROR_noifflib,error
  1781. Xexit_save:
  1782. X         rts
  1783. X
  1784. X   SECTION  data,DATA
  1785. X* First elements form $20000000 00000000 (represents 1)
  1786. X* then 1/10, 1/100 etc.
  1787. XNumberHi:
  1788. X         dc.l  $20000000,$03333333,$0051EB85,$00083126
  1789. X         dc.l  $0000D1B7,$000014F8,$00000218,$00000035
  1790. X         dc.l  $00000005,$00000000,$00000000,$00000000
  1791. X         dc.l  $00000000,$00000000,$00000000,$00000000
  1792. XNumberLo:
  1793. X         dc.l  $00000000,$33333333,$1EB851EB,$E978D4FD
  1794. X         dc.l  $1758E219,$B588E368,$DEF416BD,$AFE53579
  1795. X         dc.l  $5E63B88C,$89705F41,$0DBE6FEC,$015FD7FE
  1796. X         dc.l  $00232F33,$000384B8,$00005A12,$00000901
  1797. X
  1798. X* Still one table. This time: 2^(-1/2) , 2^(-1/4) ... times $10000.
  1799. XNumberP:
  1800. X         dc.w  $b505,$d745,$eac1,$f525,$fa84,$fd3e,$fe9e,$ff4f
  1801. X         dc.w  $ffa7,$ffd4,$ffea,$fff5,$fffa,$fffd,$ffff,$ffff
  1802. X* Inverse of former: 2^(1/2), 2^(1/4) etc.
  1803. X* Implied highest "1" has been deleted.
  1804. X* (Example: 2^(1/2) = sqrt(2) = 1.4142 x $10000 = $16a0a -> $6a0a)
  1805. XNumberL:
  1806. X         dc.w  $6A0A,$3070,$172C,$0B56,$059B,$02CA,$0164,$00B2
  1807. X         dc.w  $0059,$002C,$0016,$000B,$0006,$0003,$0001,$0001
  1808. X
  1809. X
  1810. XColors:
  1811. X         ifeq  DEPTH-5
  1812. X            dc.w  $888,$000
  1813. X            dc.w  $f00,$f30,$f60,$f90,$fc0,$ff0,$cf0,$9f0,$6f0,$3f0
  1814. X            dc.w  $0f0,$0f3,$0f6,$0f9,$0fc,$0ff,$0cf,$09f,$06f,$03f
  1815. X            dc.w  $00f,$30f,$60f,$90f,$c0f,$f0f,$f0c,$f09,$f06,$f03
  1816. X         endc
  1817. X         ifeq  DEPTH-4
  1818. X            dc.w  $888,$000
  1819. X            dc.w  $f00,$f80,$ff0,$8f0
  1820. X            dc.w  $0f0,$0f6,$0fc,$0cf,$06f
  1821. X            dc.w  $00f,$60f,$c0f,$f0c,$f06
  1822. X         endc
  1823. X         ifeq  DEPTH-3
  1824. X            dc.w  $888,$000,$f00,$ff0,$0f0,$0ff,$00f,$f0f
  1825. X         endc
  1826. X         ifeq  DEPTH-2
  1827. X            dc.w  $888,$000,$f00,$00f
  1828. X         endc
  1829. XMyNewScreen:
  1830. X         dc.w  0,0            ; offsets
  1831. X         dc.w  XSIZE,YSIZE    ; size x * y
  1832. X         dc.w  DEPTH          ; planes
  1833. X         dc.b  1,2            ; default pens
  1834. X         dc.w  VIEWMODE
  1835. X         dc.w  CUSTOMSCREEN
  1836. X         dc.l  0,ScreenTitle,0          ; font,title,gadgets
  1837. X
  1838. XMyNewWindow1:
  1839. X         dc.w  0,0
  1840. X         dc.w  XSIZE,YSIZE       ; width, heigth
  1841. X         dc.b  1,2               ; pens
  1842. X         dc.l  IDCMP1            ; IDCMP
  1843. X         dc.l  FLAGS1
  1844. X         dc.l  0,0,0             ; gadgets, checkmark, title
  1845. XInsertScreen1:
  1846. X         ds.l  1                 ; screen (to be inserted later)
  1847. X         dc.l  0                 ; bitmap
  1848. X         dc.w  -1,-1,-1,-1       ; min/max size
  1849. X         dc.w  CUSTOMSCREEN      ; screen type
  1850. X
  1851. XMyNewWindow2:
  1852. X         dc.w  WINX,WINY         ; place (to be modified later)
  1853. X         dc.w  WINW,WINH         ; width, heigth
  1854. X         dc.b  1,2               ; pens
  1855. X         dc.l  IDCMP2            ; IDCMP
  1856. X         dc.l  FLAGS2
  1857. X         dc.l  XGadget           ; ... gadgets ... (lots of them!)
  1858. X         dc.l  0,0               ; checkmark, title
  1859. XInsertScreen2:
  1860. X         ds.l  1                 ; screen (to be inserted later)
  1861. X         dc.l  0                 ; bitmap
  1862. X         dc.w  -1,-1,-1,-1       ; min/max size
  1863. X         dc.w  CUSTOMSCREEN      ; screen type
  1864. X
  1865. XuniqueID SET   0
  1866. XMakeID   macro
  1867. X\1       EQU   uniqueID
  1868. XuniqueID SET   uniqueID+1
  1869. X         endm
  1870. X
  1871. X         MakeID   GAD_X
  1872. X         MakeID   GAD_Y
  1873. X         MakeID   GAD_M
  1874. X         MakeID   GAD_Z
  1875. X         MakeID   GAD_I
  1876. X         MakeID   GAD_ZOOM
  1877. X         MakeID   GAD_DRAW
  1878. X         MakeID   GAD_RESET
  1879. X         MakeID   GAD_MANDEL
  1880. X         MakeID   GAD_JULIA
  1881. X         MakeID   GAD_QUIT
  1882. XMINUS    EQU      $8000
  1883. XSTRING   EQU      $4000
  1884. XZOOMTYPE EQU      $2000
  1885. XSETTYPE  EQU      $1000
  1886. XIDMASK   EQU      $8fff    ; so as not to mask sign
  1887. X
  1888. XXGadget:
  1889. X         dc.l  YGadget     ; link to next
  1890. X         dc.w  39,13,104,8 ; place & size
  1891. X         dc.w  GADGHCOMP
  1892. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1893. X         dc.w  STRGADGET
  1894. X         dc.l  XYBorder    ; image for gadget
  1895. X         dc.l  0
  1896. X         dc.l  XText
  1897. X         dc.l  0           ; MutualExclude
  1898. X         dc.l  XString     ; specialinfo
  1899. X         dc.w  STRING|GAD_X ; ID
  1900. X         dc.l  0
  1901. XXString:
  1902. X         dc.l  XBuffer
  1903. X         dc.l  0
  1904. X         dc.w  0
  1905. X         dc.w  13
  1906. X         dc.w  0
  1907. X         dc.w  0,0,0,0,0
  1908. X         dc.l  0
  1909. X         dc.l  0,0
  1910. XXText:
  1911. X         dc.b  1,2      ; pens
  1912. X         dc.b  RP_JAM1,0   ; drawmodes
  1913. X         dc.w  -10,0     ; offsets
  1914. X         dc.l  0        ; default font
  1915. X         dc.l  XLetter  ; (yeah, just one letter)
  1916. X         dc.l  0        ; no more text
  1917. XYGadget:
  1918. X         dc.l  YPLUSGadget     ; the next one
  1919. X         dc.w  39,26,104,8 ; place & size
  1920. X         dc.w  GADGHCOMP
  1921. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1922. X         dc.w  STRGADGET
  1923. X         dc.l  XYBorder
  1924. X         dc.l  0
  1925. X         dc.l  YText
  1926. X         dc.l  0
  1927. X         dc.l  YString     ; specialinfo
  1928. X         dc.w  STRING|GAD_Y ; ID
  1929. X         dc.l  0
  1930. XYString:
  1931. X         dc.l  YBuffer
  1932. X         dc.l  0
  1933. X         dc.w  0
  1934. X         dc.w  13
  1935. X         dc.w  0
  1936. X         dc.w  0,0,0,0,0
  1937. X         dc.l  0
  1938. X         dc.l  0,0
  1939. XYText:
  1940. X         dc.b  1,2      ; pens
  1941. X         dc.b  RP_JAM1,0   ; drawmodes
  1942. X         dc.w  -10,0    ; offsets
  1943. X         dc.l  0        ; default font
  1944. X         dc.l  YLetter  ; (yeah, just one letter)
  1945. X         dc.l  0        ; no more text
  1946. XXYBorder:
  1947. X         dc.w  -2,-2 ; place
  1948. X         dc.b  1,0   ; pens
  1949. X         dc.b  RP_JAM1
  1950. X         dc.b  5     ; # of pairs
  1951. X         dc.l  XYPairs  ; the actual data
  1952. X         dc.l  0
  1953. XXYPairs:
  1954. X         dc.w  0,0
  1955. X         dc.w  107,0
  1956. X         dc.w  107,11
  1957. X         dc.w  0,11
  1958. X         dc.w  0,0
  1959. XYPLUSGadget:
  1960. X         dc.l  YMINUSGadget ; and the next one.
  1961. X         dc.w  10,11,11,6  ; place & size
  1962. X         dc.w  GADGHCOMP|GADGIMAGE
  1963. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1964. X         dc.w  BOOLGADGET
  1965. X         dc.l  UPimage
  1966. X         dc.l  0,0,0
  1967. X         dc.l  0           ; specialinfo
  1968. X         dc.w  GAD_Y       ; ID
  1969. X         dc.l  0
  1970. XYMINUSGadget:
  1971. X         dc.l  XMINUSGadget ; and the next one.
  1972. X         dc.w  10,30,11,6  ; place & size
  1973. X         dc.w  GADGHCOMP|GADGIMAGE
  1974. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1975. X         dc.w  BOOLGADGET
  1976. X         dc.l  DOWNimage
  1977. X         dc.l  0,0,0
  1978. X         dc.l  0           ; specialinfo
  1979. X         dc.w  GAD_Y|MINUS ; ID
  1980. X         dc.l  0
  1981. XXMINUSGadget:
  1982. X         dc.l  XPLUSGadget ; and the next one.
  1983. X         dc.w  3,18,6,11   ; place & size
  1984. X         dc.w  GADGHCOMP|GADGIMAGE
  1985. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1986. X         dc.w  BOOLGADGET
  1987. X         dc.l  LEFTimage
  1988. X         dc.l  0,0,0
  1989. X         dc.l  0           ; specialinfo
  1990. X         dc.w  GAD_X|MINUS ; ID
  1991. X         dc.l  0
  1992. XXPLUSGadget:
  1993. X         dc.l  MGadget     ; and the next one.
  1994. X         dc.w  22,18,6,11  ; place & size
  1995. X         dc.w  GADGHCOMP|GADGIMAGE
  1996. X         dc.w  RELVERIFY|GADGIMMEDIATE
  1997. X         dc.w  BOOLGADGET
  1998. X         dc.l  RIGHTimage
  1999. X         dc.l  0,0,0
  2000. X         dc.l  0           ; specialinfo
  2001. X         dc.w  GAD_X       ; ID
  2002. X         dc.l  0
  2003. XMGadget:
  2004. X         dc.l  MPLUSGadget ; more to come...
  2005. X         dc.w  23,42,40,8 ; place & size
  2006. X         dc.w  GADGHCOMP
  2007. X         dc.w  RELVERIFY|GADGIMMEDIATE
  2008. X         dc.w  STRGADGET
  2009. X         dc.l  MBorder
  2010. X         dc.l  0
  2011. X         dc.l  MText
  2012. X         dc.l  0
  2013. X         dc.l  MString     ; specialinfo
  2014. X         dc.w  STRING|GAD_M ; ID
  2015. X         dc.l  0
  2016. XMString:
  2017. X         dc.l  MBuffer
  2018. X         dc.l  0
  2019. X         dc.w  0
  2020. X         dc.w  9
  2021. X         dc.w  0
  2022. X         dc.w  0,0,0,0,0
  2023. X         dc.l  0
  2024. X         dc.l  0,0
  2025. XMText:
  2026. X         dc.b  1,2      ; pens
  2027. X         dc.b  RP_JAM1,0   ; drawmodes
  2028. X         dc.w  -18,0    ; offsets
  2029. X         dc.l  0        ; default font
  2030. X         dc.l  MLetter  ; (yeah, just one letter)
  2031. X         dc.l  0        ; no more text
  2032. XMBorder:
  2033. X         dc.w  -2,-2 ; place
  2034. X         dc.b  1,0   ; pens
  2035. X         dc.b  RP_JAM1
  2036. X         dc.b  5     ; # of pairs
  2037. X         dc.l  MPairs   ; the actual data
  2038. X         dc.l  0
  2039. XMPairs:
  2040. X         dc.w  0,0
  2041. X         dc.w  43,0
  2042. X         dc.w  43,11
  2043. END_OF_FILE
  2044. if test 26047 -ne `wc -c <'source/gui.asm.ac'`; then
  2045.     echo shar: \"'source/gui.asm.ac'\" unpacked with wrong size!
  2046. fi
  2047. # end of 'source/gui.asm.ac'
  2048. fi
  2049. echo shar: End of archive 2 \(of 4\).
  2050. cp /dev/null ark2isdone
  2051. MISSING=""
  2052. for I in 1 2 3 4 ; do
  2053.     if test ! -f ark${I}isdone ; then
  2054.     MISSING="${MISSING} ${I}"
  2055.     fi
  2056. done
  2057. if test "${MISSING}" = "" ; then
  2058.     echo You have unpacked all 4 archives.
  2059.     rm -f ark[1-9]isdone
  2060. else
  2061.     echo You still need to unpack the following archives:
  2062.     echo "        " ${MISSING}
  2063. fi
  2064. ##  End of shell archive.
  2065. exit 0
  2066. -- 
  2067. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  2068. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  2069. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  2070.